/**
 *
 */
package br.com.werp.regras.pessoa.controle;

import br.com.werp.regras.geral.Auditoria;
import br.com.werp.regras.geral.FabricaSubSistema;
import br.com.werp.regras.geral.GerenciamentoEndereco;
import br.com.werp.regras.geral.GerenciamentoPessoa;
import br.com.werp.regras.geral.Sequenciador;
import br.com.werp.regras.geral.helpers.CepHelper;
import br.com.werp.regras.geral.helpers.CidadeHelper;
import br.com.werp.regras.geral.util.BeanUtil;
import br.com.werp.regras.geral.util.Util;
import br.com.werp.regras.geral.vos.pessoa.ContatoVO;
import br.com.werp.regras.geral.vos.pessoa.OrgaoPublicoFormVO;
import br.com.werp.regras.geral.vos.pessoa.OrgaoPublicoVO;
import br.com.werp.regras.geral.vos.tabelas.Bairro;
import br.com.werp.regras.geral.vos.tabelas.Cep;
import br.com.werp.regras.geral.vos.tabelas.Cidade;
import br.com.werp.regras.geral.vos.tabelas.Contato;
import br.com.werp.regras.geral.vos.tabelas.Endereco;
import br.com.werp.regras.geral.vos.tabelas.Logradouro;
import br.com.werp.regras.geral.vos.tabelas.Orgao_publico;
import br.com.werp.regras.geral.vos.tabelas.Pessoa;
import br.com.werp.regras.geral.vos.tabelas.Uf;
import br.com.werp.regras.pessoa.integracao.FabricaDAO;
import br.com.werp.regras.pessoa.integracao.OrgaoPublicoDAO;
import br.com.werp.regras.pessoa.integracao.PessoaDAO;

import java.util.List;


/**
 * @author Italo
 *
 *26/06/2006
 */
public class ControleOrgaoPublico {
    public void persistirOrgaoPublico(Object form, String usuario)
        throws Exception {
        OrgaoPublicoFormVO orgaoPublicoFormVO = new OrgaoPublicoFormVO();
        OrgaoPublicoVO orgaoPublicoVO = new OrgaoPublicoVO();

        BeanUtil.copiarVO(form, orgaoPublicoFormVO);
        BeanUtil.copiarVOStringTipo(orgaoPublicoFormVO, orgaoPublicoVO);

        int pess_id = Util.zeroOuInt(orgaoPublicoFormVO.getPess_id());

        OrgaoPublicoDAO orgaoPublicoDAO = FabricaDAO.getOrgaoPublicoDAO();
        PessoaDAO pessoaDAO = FabricaDAO.getPessoaDAO();
        ControleContato controleContato = new ControleContato();

        Auditoria auditoria = FabricaSubSistema.getAuditoria();
        Object key = orgaoPublicoDAO.iniciarTransacao();

        try {
            if (pess_id == 0) {
                Sequenciador sequenciador = FabricaSubSistema.getSequenciador();
                pess_id = sequenciador.obterProximoId(Sequenciador.PESSOA);

                Pessoa pessoa = new Pessoa();
                pessoa.setPess_id(pess_id);
                pessoa.setPess_nome(orgaoPublicoFormVO.getPess_nome());
                pessoaDAO.inserirPessoa(pessoa, key);
                auditoria.auditarRecurso(key, usuario, pessoa, Auditoria.INCLUIR);

                Orgao_publico orgao_publico = new Orgao_publico();
                orgao_publico.setOrpb_pessoa(pess_id);
                orgao_publico.setOrpb_esfera(orgaoPublicoFormVO.getOrpb_esfera());
                orgaoPublicoDAO.inserirVOGenericoSemIdentity(key, orgao_publico);
                auditoria.auditarRecurso(key, usuario, orgao_publico,
                    Auditoria.INCLUIR);
                orgaoPublicoVO.setPess_id(pess_id);

                filtrarContatoPessoaOrgaoPublico(orgaoPublicoFormVO,
                    orgaoPublicoVO);
                controleContato.persistirContatos(key, usuario, orgaoPublicoVO,
                    Auditoria.INCLUIR);
            } else {
                Pessoa pessoa = new Pessoa();
                pessoa.setPess_id(pess_id);
                pessoa.setPess_nome(orgaoPublicoFormVO.getPess_nome());
                pessoaDAO.atualizarPessoa(pessoa, key);
                auditoria.auditarRecurso(key, usuario, pessoa, Auditoria.ALTERAR);

                Orgao_publico orgao_publico = new Orgao_publico();
                orgao_publico.setOrpb_pessoa(pess_id);
                orgao_publico.setOrpb_esfera(orgaoPublicoFormVO.getOrpb_esfera());
                orgaoPublicoDAO.atualizarOrgaoPublico(key, orgao_publico);
                auditoria.auditarRecurso(key, usuario, orgao_publico,
                    Auditoria.ALTERAR);
                filtrarContatoPessoaOrgaoPublico(orgaoPublicoFormVO,
                    orgaoPublicoVO);
                controleContato.persistirContatos(key, usuario, orgaoPublicoVO,
                    Auditoria.ALTERAR);
            }

            orgaoPublicoDAO.concluirTransacao(key);
        } catch (Exception e) {
            orgaoPublicoDAO.abortarTransacao(key);
            throw e;
        }
    }

    public List pesquisarOrgaoPublico(Object form) throws Exception {
        OrgaoPublicoVO orgaoPublicoVO = new OrgaoPublicoVO();

        BeanUtil.copiarVOStringTipo(form, orgaoPublicoVO);

        OrgaoPublicoDAO orgaoPublicoDAO = FabricaDAO.getOrgaoPublicoDAO();

        return orgaoPublicoDAO.pesquisarOrgaoPublico(orgaoPublicoVO);
    }

    public void carregarOrgaoPublico(Object form) throws Exception {
        OrgaoPublicoVO orgaoPublicoVO = new OrgaoPublicoVO();
        BeanUtil.copiarVOStringTipo(form, orgaoPublicoVO);

        OrgaoPublicoDAO orgaoPublicoDAO = FabricaDAO.getOrgaoPublicoDAO();

        orgaoPublicoVO = (OrgaoPublicoVO) Util.get0(orgaoPublicoDAO.pesquisarOrgaoPublico(
                    orgaoPublicoVO));

        BeanUtil.copiarVO(carregarContatos(orgaoPublicoVO), form);
    }

    private void filtrarContatoPessoaOrgaoPublico(
        OrgaoPublicoFormVO orgaoPublicoFormVO, OrgaoPublicoVO orgaoPublicoVO)
        throws Exception {
        ContatoVO telefone = new ContatoVO();
        telefone.setCont_descricao(orgaoPublicoFormVO.getTelefone());
        telefone.setCont_tipo_contato(GerenciamentoPessoa.TELEFONE_RESIDENCIAL);
        orgaoPublicoVO.adicionarContatos(telefone);

        ContatoVO email = new ContatoVO();
        email.setCont_descricao(orgaoPublicoFormVO.getEmail());
        email.setCont_tipo_contato(GerenciamentoPessoa.EMAIL);
        orgaoPublicoVO.adicionarContatos(email);

        int cepId = Util.zeroOuInt(orgaoPublicoFormVO.getCep());

        if (cepId != 0) {
            ContatoVO endComercial = new ContatoVO();
            endComercial.setCont_tipo_contato(GerenciamentoPessoa.END_COMERCIAL);
            endComercial.setCont_descricao(GerenciamentoPessoa.END_COMERCIAL);

            Endereco endereco = new Endereco();
            Cep cep = null;

            if ("".equals(orgaoPublicoFormVO.getCep())) {
                cep = Util.converteCEP(orgaoPublicoFormVO.getCep_label());
            }

            if (cep == null) {
                cep = CepHelper.obterCep(orgaoPublicoFormVO.getCep());
            }

            endereco.setEndr_cep(cep.getCeps_id());
            endereco.setEndr_compl(orgaoPublicoFormVO.getComplemento());
            endereco.setEndr_referencia(orgaoPublicoFormVO.getReferencia());
            endereco.setEndr_num(orgaoPublicoFormVO.getNumero());
            endComercial.setEndereco(endereco);
            orgaoPublicoVO.adicionarContatos(endComercial);
        }
    }

    public OrgaoPublicoFormVO carregarContatos(OrgaoPublicoVO orgaoPublicoVO)
        throws Exception {
        GerenciamentoEndereco gerenciamentoEndereco = FabricaSubSistema.getGerenciamentoEndereco();
        OrgaoPublicoFormVO orgaoPublicoFormVO = new OrgaoPublicoFormVO();
        BeanUtil.copiarVOTipoString(orgaoPublicoVO, orgaoPublicoFormVO);

        GerenciamentoPessoa contatoPessoa = FabricaSubSistema.getGerenciamentoPessoa();
        Contato contatoTel = contatoPessoa.obterContato(String.valueOf(
                    orgaoPublicoVO.getPess_id()),
                GerenciamentoPessoa.TELEFONE_RESIDENCIAL);

        if (contatoTel != null) {
            orgaoPublicoFormVO.setTelefone(contatoTel.getCont_descricao());
        }

        Contato contatoEmail = contatoPessoa.obterContato(String.valueOf(
                    orgaoPublicoVO.getPess_id()), GerenciamentoPessoa.EMAIL);

        if (contatoEmail != null) {
            orgaoPublicoFormVO.setEmail(contatoEmail.getCont_descricao());
        }

        Contato contatoEnd = contatoPessoa.obterContato(String.valueOf(
                    orgaoPublicoVO.getPess_id()),
                GerenciamentoPessoa.END_COMERCIAL);

        Endereco endereco = new Endereco();

        if (contatoEnd != null) {
            endereco = contatoPessoa.obterEndereco(String.valueOf(
                        contatoEnd.getCont_id()));
        }

        Cep cep = CepHelper.obterCep(String.valueOf(endereco.getEndr_cep()));

        if (cep != null) {
            orgaoPublicoFormVO.setCep_label(String.valueOf(cep.getCeps_numero()));
        }

        if (cep != null) {
            Bairro bairro = new Bairro();
            bairro.setBair_id(cep.getCeps_bairro());
            bairro = (Bairro) Util.get0(gerenciamentoEndereco.pesquisarBairroVOTabela(
                        bairro));

            orgaoPublicoFormVO.setBairro(bairro.getBair_descricao());
        }

        if (cep != null) {
            Logradouro logradouro = new Logradouro();
            logradouro.setLogr_id(cep.getCeps_logradouro());
            logradouro = (Logradouro) Util.get0(gerenciamentoEndereco.pesquisarLogradouroVOTabela(
                        logradouro));
            orgaoPublicoFormVO.setLogradouro(logradouro.getLogr_descricao());
        }

        if (endereco != null) {
            orgaoPublicoFormVO.setCep(String.valueOf(endereco.getEndr_cep()));
            orgaoPublicoFormVO.setComplemento(endereco.getEndr_compl());
            orgaoPublicoFormVO.setNumero(endereco.getEndr_num());
            orgaoPublicoFormVO.setReferencia(endereco.getEndr_referencia());
        }

        Cidade cidade = new Cidade();

        if (cep != null) {
            cidade = CidadeHelper.obterCidade(String.valueOf(
                        cep.getCeps_cidade()));
        }

        if ((cidade != null) && (cidade.getCida_uf() != 0)) {
            orgaoPublicoFormVO.setCidade(cidade.getCida_descricao());

            Uf uf = new Uf();
            uf.setUnfd_id(cidade.getCida_uf());
            uf = (Uf) Util.get0(gerenciamentoEndereco.pesquisarUFVOTabela(uf));
            orgaoPublicoFormVO.setUf(uf.getUnfd_descricao());
        }

        return orgaoPublicoFormVO;
    }

    public void excluirOrgaoPublico(Object form, String usuario)
        throws Exception {
        OrgaoPublicoDAO orgaoPublicoDAO = FabricaDAO.getOrgaoPublicoDAO();

        PessoaDAO pessoaDAO = FabricaDAO.getPessoaDAO();

        Object key = orgaoPublicoDAO.iniciarTransacao();

        try {
            OrgaoPublicoVO orgaoPublicoVO = new OrgaoPublicoVO();

            BeanUtil.copiarVOStringTipo(form, orgaoPublicoVO);

            ControleContato controleContato = new ControleContato();
            controleContato.apagarTodosContatos(key, orgaoPublicoVO, usuario);

            Pessoa pessoa = new Pessoa();
            BeanUtil.copiarVO(orgaoPublicoVO, pessoa);

            Orgao_publico orgao_publico = new Orgao_publico();
            orgao_publico.setOrpb_pessoa(pessoa.getPess_id());

            orgaoPublicoDAO.excluirOrgaoPublico(key, orgao_publico);

            pessoaDAO.excluirPessoa(key, pessoa);

            Auditoria auditoria = FabricaSubSistema.getAuditoria();

            auditoria.auditarRecurso(key, usuario, orgao_publico,
                Auditoria.EXCLUIR);

            auditoria.auditarRecurso(key, usuario, pessoa, Auditoria.EXCLUIR);
            orgaoPublicoDAO.concluirTransacao(key);
        } catch (Exception e) {
            orgaoPublicoDAO.abortarTransacao(key);
        }
    }
}
